iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
SideProject30

用 Rails 打造你的電商網站系列 第 6

Day 06 - 為你的會員分類

  • 分享至 

  • xImage
  •  

前置作業: 在 User 的 model 增加 role 的欄位,型態是 integer

前言

網站的使用者會分很多種角色

以電商網站的例子來說,可能會分成

網站管理員 商店老闆 商店員工 一般使用者 VIP

所以我們需要一個欄位來判斷這個使用者是哪個角色

我們可以使用 enum 來快速的完成這個功能

Enum 是什麼

Enum 的全名為 Enumerations,中文為列舉的意思

我們可以將資料分成「列舉」中的分類

藉此來幫助我們做資料上的區別

為什麼要使用 Enum

Enum 除了能幫我們將資料分類起來,

我們還可以透過 Enum 將這個欄位的資料型態存為 Integer

Integer (個位數)相較於 String 所佔的記憶體小

不過撈出資料來的時候會顯示出一個 String,讓開發者更知道這筆資料是在哪個分類之下

該怎麼設定 Enum

先到 user 的檔案中,加入 enum 設定

在這邊提一下, enum 有兩種寫法

第一種

Array 的第一個對應到的 integer 為 0,依此類推

# app/model/user.rb

enum role: [:admin, :owner, :employee, :vip, :user]

第二種

Hash 中的第一個對應到的 integer 可以自行設定,沒有設定的話就是 0

# app/model/user.rb

enum role: { admin: 1, owner: 2, employee: 3, vip: 4, user: 5 }

設定預設值

第一種:在 table 中設定

我們可以在 migration 指定預設值給他,

建議是使用這種做法,程式碼改變的時候,也不會影響

要做這個設定的話,我們就先產生一個 migration,並且加上 default 值給他

 def change
   add_column :users, :role, default: 4
 end

之後建立 user ,就會自動給他設定角色為 user

第二種,給 default 參數

在 Rails 6.1 版本後, enum 可以用 default 來新增預設值囉

只要在後面加上 _default: 加上你要設定的預設角色即可

enum role: [:user, :admin, :owner, :employee, :vip], _default: :user

你以為 enum 就只有這樣嗎?其實他還提供了我們很多便利的方法

Enum 提供的方法

如果我們在一個 model 中有許多個 enum 方法,我們可以使用前綴及後綴的方式來避免混淆

_prefix

方法前面加上欄位名稱當作前綴

# app/model/user.rb

enum role: %i[user admin owner employee vip], _default: :user, _prefix: true
# 在 rails console 中

User.last.role_user? # 回傳 true 或 false

還可以自定義前綴名稱,在 _prefix 後面加上你要換的名稱的 symbol

enum role: %i[user admin owner employee vip], _default: :user, _prefix: :authorize
# 在 rails console 中

User.last.authorize_user? # 回傳 true 或 false

_suffix

方法後面加上欄位名稱當作後綴

# app/model/user.rb

enum role: %i[user admin owner employee vip], _default: :user, _suffix: true
# 在 rails console 中

User.last.user_role? # 回傳 true 或 false

還可以自定義後綴名稱,在 _prefix 後面加上你要換的名稱的 symbol

enum role: %i[user admin owner employee vip], _default: :user, _suffix: :authorize
# 在 rails console 中

User.last.user_authorize? # 回傳 true 或 false

直接改變角色

在開發的時候,如果想立刻切換角色來看效果的話,這個方法非常實用!

我們只要在角色後面加個驚嘆號

在 rails console 

User.last.admin!

從資料庫找出特定角色的使用者

如果我想撈出所有角色是老闆的 user,

可以直接下角色的方法

在 rails console

User.owner

判斷此使用者是不是某個角色

假設我今天要判斷這個 user 是不是管理員,

可以直接在角色後面加 ?

# 在 view 裡面

current_user.admin? #回傳 true 或者 false
# 在 rails console 裡面

User.last.admin? #回傳 true 或者 false

假設我們在 view 要給使用者依照 enum 的分類去選擇

用以下方式可以撈出來,並且搭配 options_for_select 等方法,就可以輕鬆做出 enum 的下拉選單

User.roles

上一篇
Day 05 - 把機密資訊放到保險櫃中
下一篇
Day 07 建立商品資料
系列文
用 Rails 打造你的電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言